<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8" lang="en"> <![endif]-->
<!--[if gt IE 8]><!-->  <html class="no-js" lang="en"> <!--<![endif]-->
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	
	<title>Visitor</title>
	
	<meta name="description" content="A jQuery library for modern HTML presentations">
	<meta name="author" content="Caleb Troughton">
	<meta name="viewport" content="width=1024, user-scalable=no">
	
	<!-- Core and extension CSS files -->
	<link rel="stylesheet" href="../core/deck.core.css">
	<link rel="stylesheet" href="../extensions/goto/deck.goto.css">
	<link rel="stylesheet" href="../extensions/menu/deck.menu.css">
	<link rel="stylesheet" href="../extensions/navigation/deck.navigation.css">
	<link rel="stylesheet" href="../extensions/status/deck.status.css">
	<link rel="stylesheet" href="../extensions/hash/deck.hash.css">
	<link rel="stylesheet" href="../extensions/scale/deck.scale.css">
	
	<!-- Style theme. More available in /themes/style/ or create your own. -->
	<link rel="stylesheet" href="../themes/style/swiss.css">
	
	<!-- Transition theme. More available in /themes/transition/ or create your own. -->
	<link rel="stylesheet" href="../themes/transition/horizontal-slide.css">
	
	<script src="../modernizr.custom.js"></script>
	

    <!-- SintaxHighlighter -->
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>SyntaxHighlighter Large File Demo</title>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/XRegExp.js"></script>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/shCore.js"></script>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/shBrushJava.js"></script>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/shBrushBash.js"></script>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/shBrushPlain.js"></script>
	<script type="text/javascript" src="../SyntaxHighlighter-master/scripts/shBrushPython.js"></script>
	<link type="text/css" rel="stylesheet" href="../SyntaxHighlighter-master/styles/shCoreEclipse.css"/>
	<!--link type="text/css" rel="stylesheet" href="../SyntaxHighlighter-master/styles/shThemeEclipse.css"/-->
	
	<script type="text/javascript">SyntaxHighlighter.all();</script>

	
	
</head>

<body class="deck-container">

<!-- Begin slides -->
<section class="slide" id="visitor1">
	<h2>Visitor</h2>
	<p>Tenemos varios tipos de publicaciones que queremos unificar la forma en que se muestran</p>
	<h3>Noticias</h3>
	<img src="NewsNote.png"/>
	<h3>Publicidad de google</h3>
	<img src="GoogleNotes.png"/>
	<h3>Publicación de Amazon</h3>
	<img src="AmazonNote.png"/>

</section>

<section class="slide" id="visitor2">
	<h2>Visitor</h2>
	<p>Los parámetros que tendrían cada uno de los objetos seria algo así</p>
	<img src="NotesParameters.png"/>
	<p>Una posible forma de poder unificar la forma de mostrarlos sería usar herencia y que todos tengan un método para imprimir</p>
	<img src="NoteInheritance.png"/>
	<p>Pero si queremos agregar otra operación tenemos que volver a modificar toda la estructura de clase</p>
	<p>El patrón Visitor me permite tener la flexibilidad de agregar nuevas operaciones sobre la estructura de objetos sin tener que tocar el código de la misma.</p>
</section>
<section class="slide" id="visitor3">
	<h2>Patrón Visitor</h2>
	<p>Visitor es una forma de separar de la estrctura de objetos en la que opera. Cada nueva visitor concreto agrega una nueva operación</p>
	<ul>
		<li>Motivación: Poder agregar nuevas operaciones sin tener que cambiar el código de una estructura de clases. Una manera de seguir el principio de abierto para la extensión cerrado para la modificación.
		Permite iterar una estructura de clases podiendo utilizar las distintas operaciones agregadas por el visitor	
		</li>
		<li>Aplicabilidad: 
			<ul>
				<li>Una estructura de objetos contiene muchas clases de objetos con interfaces distintas, y se quiere realizar sobre ellos operaciones que son distintas en cada clase concreta</li>
				<li>Se quieren realizar muchas operaciones distintas sobre los objetos de una estructura, sin incluir dichas operaciones en las clases</li>
				<li>Las clases que forman la estructura de objetos no cambian, pero las operaciones sobre ellas sí</li>
				<li>Utilizar el patrón visitor si la jerarquía de clases es estable</li>
			</ul>	
		</li>
	</ul>	
</section>
<section class="slide" id="visitor4">
	<h2>Patrón Visitor</h2>
	<ul>
		<li>Participantes: 
			<ul>
				<li><strong>Visitor:</strong> define una operación de visita para cada clase de elemento concreto en la estructura de objetos</li>
				<li><strong>ConcreteVisitor:</strong> Implementa la interfaz Visitor .Cada operación implementa un fragmento de la labor global del visitor concreto, pudiendo almacenar información local</li>
				<li><strong>Element:</strong> define una operación accept con un visitor como argumento</li>
				<li><strong>ConcreteElement (AssignmentNode):</strong> implementa la operación accept()</li>
				<li><strong>Client:</strong> Elije que operación va a utilizar seleccionado el visitor apropiado</li>
			</ul>	
		</li>
		<li>Consecuencias:
			<ul>
				<li>Facilita la definición de nuevas operaciones</li>
				<li>Agrupa operaciones relacionadas</li>
				<li>Añadir nuevas clases ConcreteElement es costoso. Utilizar para jerarquías estables</li>
				<li>Permite atravesar jerarquías de objetos que no están relacionados por un padre común</li>
				<li>Permite atravesar jerarquías de objetos que no están relacionados por un padre común</li>
				<li>El visitor puede acumular el estado de una operación al visitar la estructura de objetos, en vez de pasarlo como argumento o usar variables globales</li>
				<li>Rompe la encapsulación</li>
			</ul>	
		</li>	
	</ul>	
</section>
<section class="slide" id="visitor5">
	<h2>Patrón Visitor</h2>
	<ul>
		<li>Estructura: 
			<img src="visitorClassDiagram.png"/>
		</li>
	</ul>	
</section>


<section class="slide" id="visitor8">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<p>Crear una jerarquía de clases de visitantes. Esta jerarquizar define un método visit() en la clase abstracta para que las clases concretas implementen en ese método la operación que se desea agregar. El método visit() acepta un solo argumento; un puntero o una referencia a una clase de elemento de la jerarquía de clases a la que queremos agregarle la operación o funcionalidad.</p>
	<img src="VisitorHierarchy.png"/>
	<p>Cada operación que se va a agregar se implementa en el visitor concreto. En este caso tenemos dos formas de presentación de las publicaciones</p>

</section>
<section class="slide" id="visitor9">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<ol>
		<li>Creamos la interface o clase abtracta visitor
		<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
			public interface NoteVisitor {
				void visit(GoggleNote note);
				void visit(AmazonNote note);
				void visit(NewsNote note);
			}
		</script>
		</li>
		<li>Una de las clases que imprime. Cada operación que se quiera hacer sobre los objetos de la jerarquía va a terminar siendo una clase mas concreta de tipo NoteVisitor
		<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
			public class NoteRawPrinter implements NoteVisitor{
				public void visit(GoggleNote note) {
					System.out.println("Nota de google");
					System.out.println("Cabecera: " + note.heading);
					System.out.println();
				}
				public void visit(AmazonNote note) {
					System.out.println("Nota de Amazon");
					System.out.println("Titulo: " + note.title);
					System.out.println();
				}
				public void visit(NewsNote note) {
					System.out.println("Nota de Noticias");
					System.out.println("Cabecera:" + note.headline);
					System.out.println("");
				}
			}
		</script>
		</li>
	</ol>	
</section>
<section class="slide" id="visitor10">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<p>Creamos una interface o clase abstracta Note de la que van a heredar las clases no relacionadas AmazonNote, GoggleNote, NewsNote con un solo metodos accept() que recibe un argumento simple que es la clase abstracta de la jerarquía de visitor</p>
	<img src="ElemetsHierarchy.png"/>
</section>
<section class="slide" id="visitor11">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<ol start="3">
		<li>Creamos la interface o clase abtracta Note
		<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
			public interface Note {
				void accept(NoteVisitor visitor);
			}
		</script>
		</li>
		<li>Hacemos que las clases hereden de la clase Note e implementamos el método accept()
		<script type="syntaxhighlighter" class="brush: plain; toolbar: false;">
			public class GoggleNote implements Note{
				public String heading;
				public String excerpt;
				public String url;
				
				public GoggleNote(String heading, String excerpt, String url){
					this.heading = heading;
					this.excerpt = excerpt;
					this.url = url;
				}
				
				public void accept(NoteVisitor visitor){
					visitor.visit(this);
				}
			}
		</script>
		<p>El método accept() que usa el argumento de tipo visitor que fue pasado como parámetro en el método para llamar al método visit y pasar como argumento la clase concreta en la que estamos (this)</p>
		<p>El método visit utiliza la sobrecarga del método para encontrar la operación adecuada a el tipo de la clase que llama al visit</p>
		<!--p>Cada método visit de un visitante concreto puede ser pensado como un método que no es de una sola clase, sino de un par de clases: la del <strong>visitante concreto</strong> y la del <strong>elemento particular</strong>. Así el patrón visitor simula el envío doble (Double-Dispatch) en un lenguaje convencional orientado a objetos de envío único (Single-Dispatch), como son Java o C++.</p-->
		</li>
	</ol>	
</section>
<section class="slide" id="visitor12">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<ol start="5">
		<li>Creamos 2 notas unas de Amazon y una de google
		<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
			Note amazonNote = new AmazonNote("Costa ardiente","Wilbur Smith", "ISBN:99898989", 190);
			Note googleNote = new GoggleNote("cosa", "cosa", "http://cosas.com");
		</script>
		</li>
		<li>Creamos un visitador simple y uno detallado
			<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
				NoteVisitor noteRawPrinter = new NoteRawPrinter();
				NoteVisitor noteDetalisPrinter = new NoteDetalisPrinter();
			</script>
		</li>
		<li>Le mandamos a la nota el visitador detallado
			<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
				amazonNote.accept(noteDetalisPrinter);
				googleNote.accept(noteDetalisPrinter);
			</script>
		</li>
		<li>
			No da la impresión detallada de cada una de las notas
			<script type="syntaxhighlighter" class="brush: text; toolbar: false;">
				Titulo: Costa ardiente
				Precio: 190.0
				Autor: Wilbur Smith
				ISBN: 99898989

				Cabecera: cosa
				Extractocosa
				URL: http://cosas.com
			</script>
		</li>
	</ol>	
</section>
<section class="slide" id="visitor13">
	<h2>Visitor</h2>
	<h3>Implementación</h3>
	<ol start="9">
		<li>Le mandamos a la nota el visitador simple
			<script type="syntaxhighlighter" class="brush: java; toolbar: false;">
				amazonNote.accept(noteRawPrinter);
				googleNote.accept(noteRawPrinter);
			</script>
		</li>
		<li>
			No da la impresión simple de cada una de las notas
			<script type="syntaxhighlighter" class="brush: text; toolbar: false;">
				Titulo: Costa ardiente

				Cabecera: cosa
			</script>
		</li>
	</ol>	
</section>
<section class="slide" id="visitor14">
	<h2>Visitor</h2>
	<p>Recordemos que hay que usar visitor en jerarquías de clases estáticas.</p>
	<p>La estructura de clases que teníamos era:</p>
	<img src="ElemetsHierarchy.png"/>
	<p>Si queremos agregar un elemento RssNote por ejemplo tenemos que modificar la interfaces NoteVisitor y agregar el visit(RssNote) lo que implica tocar en esta caso cada una de las clases Concretas NoteVisitor, en este caso NoteDetailPrinter y NoteRawPrinter</p>	
	<img src="VisitorHierarchy.png"/>
</section>
<section class="slide" id="visitor14">
	<h2>Referencias</h2>
	<p>Head First Design Patterns</p>
	<p>http://www.cogentconsulting.com.au/</p>
	<p>http://es.wikipedia.org/wiki/Visitor_(patr%C3%B3n_de_dise%C3%B1o)</p>
	<p>http://en.wikipedia.org/wiki/Visitor_pattern</p>
</section>
<!----------------------------------------------------------------------------------------------->
<!-- deck.navigation snippet -->
<a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
<a href="#" class="deck-next-link" title="Next">&#8594;</a>

<!-- deck.status snippet -->
<p class="deck-status">
	<span class="deck-status-current"></span>
	/
	<span class="deck-status-total"></span>
</p>

<!-- deck.goto snippet -->
<form action="." method="get" class="goto-form">
	<label for="goto-slide">Go to slide:</label>
	<input type="text" name="slidenum" id="goto-slide" list="goto-datalist">
	<datalist id="goto-datalist"></datalist>
	<input type="submit" value="Go">
</form>

<!-- deck.hash snippet -->
<a href="." title="Permalink to this slide" class="deck-permalink">#</a>


<!-- Grab CDN jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../jquery-1.7.2.min.js"><\/script>')</script>

<!-- Deck Core and extensions -->
<script src="../core/deck.core.js"></script>
<script src="../extensions/hash/deck.hash.js"></script>
<script src="../extensions/menu/deck.menu.js"></script>
<script src="../extensions/goto/deck.goto.js"></script>
<script src="../extensions/status/deck.status.js"></script>
<script src="../extensions/navigation/deck.navigation.js"></script>
<script src="../extensions/scale/deck.scale.js"></script>

<!-- Initialize the deck -->
<script>
$(function() {
	$.deck('.slide');
});
</script>

</body>



</html>
